// 路由鉴权: 鉴权, 项目当中路由能否被访问的权限设置
import router from '@/router';
import nprogress from 'nprogress';
// 引入进度条样式
import 'nprogress/nprogress.css';

nprogress.configure({showSpinner: false});

import {useUserStore} from '@/store/modules/user';
import pinia from '@/store';
import {sessionStorage} from '@/utils/storage';

const userStore = useUserStore(pinia);

// 全局守卫: 项目当中任意路由切换都会触发的钩子
// 全局前置守卫
router.beforeEach(async (to, from, next) => {
    // 设置页面标题
    document.title = `${import.meta.env.VITE_APP_TITLE} - ${to.meta.title || '页面'}`;

    nprogress.start();

    // 获取 token，用于判断用户登录状态
    const token = sessionStorage.get('token');
// 获取用户名
    const username = userStore.username;

    // 判断用户是否登录
    if (token) {
        if (to.path === '/login') {
            // 登录成功，访问 login 页面时跳转首页
            next({path: '/'});
        } else {
            // 已登录且有用户名信息时直接放行
            if (username) {
                next();
            } else {
                try {
                    // 获取用户信息
                    await userStore.userInfo();
                    // 放行当前路由，确保异步路由加载完成
                    next({...to, replace: true});
                } catch (error) {
                    // 捕获异常: token 过期或用户信息无效
                    await userStore.userLogout();
                    next({path: '/login', query: {redirect: to.fullPath}});
                }
            }
        }
    } else {
        // 未登录用户的逻辑处理
        if (['/login', '/register'].includes(to.path)) {
            // 如果是登录或注册页，直接放行
            next();
        } else {
            // 未登录用户访问其他页面时跳转登录页
            next({path: '/login', query: {redirect: to.fullPath}});
        }
    }
});

// 全局后置守卫
router.afterEach(() => {
    nprogress.done();
});
